package com.nmf.site.biz.pay.ali.util;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.nmf.site.biz.pay.ali.config.AlipayConfig;
import com.nmf.site.biz.pay.ali.sign.AliPayMD5;

/* *
 *类名：RsaAlipayNotify
 *功能：支付宝通知处理类
 *详细：处理支付宝各接口通知返回
 *版本：3.3
 *日期：2012-08-17
 *说明：
 *以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用，只是提供一个参考

 *************************注意*************************
 *调试通知返回时，可查看或改写log日志的写入TXT里的数据，来检查通知返回是否正常
 */
@Component
public class AlipayNotify {
	private final static Logger log = LoggerFactory.getLogger(AlipayNotify.class);
	@Autowired
	AlipayCore alipayCore;
	@Autowired
	AlipayConfig alipayConfig;
	
	/**
	 * 支付宝消息验证地址
	 */
	private final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";

	/**
	 * 验证消息是否是支付宝发出的合法消息
	 * 
	 * @param params
	 *            通知返回来的参数数组
	 * @return 验证结果
	 */
	public boolean verify(Map<String, String> params) {

		// 判断responsetTxt是否为true，isSign是否为true
		// responsetTxt的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
		// isSign不是true，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
		String responseTxt = "true";
		// if (params.get("notify_id") != null) {
		// String notify_id = params.get("notify_id");
		// responseTxt = verifyResponse(notify_id);
		// }
		String sign = "";
		String signType = "";
		if (params.get("sign") != null) {
			sign = params.get("sign");
		}
		if (params.get("sign_type") != null) {
			signType = params.get("sign_type");
		}
		boolean isSign = getSignVeryfy(params, sign, signType);

		// 写日志记录（若要调试，请取消下面两行注释）
		String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数：" + alipayCore.createLinkString(params);

		log.info(sWord);

		if (isSign && responseTxt.equals("true")) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 根据反馈回来的信息，生成签名结果
	 * 
	 * @param Params
	 *            通知返回来的参数数组
	 * @param sign
	 *            比对的签名结果
	 * @return 生成的签名结果
	 */
	private boolean getSignVeryfy(Map<String, String> Params, String sign, String signType) {
		// 过滤空值、sign与sign_type参数
		Map<String, String> sParaNew = alipayCore.paraFilter(Params);
		// 获取待签名字符串
		String preSignStr = alipayCore.createLinkString(sParaNew);
		// 获得签名验证结果
		boolean isSign = false;
		if (signType.equals("MD5")) {
			// String sign =
			// MD5.getMD5ofStr(sortReqStr+securityCode).toLowerCase();
			String sign2 = AliPayMD5.sign(preSignStr, alipayConfig.securityCode, AliPayMD5.DEFAULT_ENCODING);

			isSign = sign2.equals(sign);
		}
		return isSign;
	}

}
